// core/init_ip_db.go
// =============================================================================
// | 包: core                                                                  |
// | 模块: IP地址数据库初始化                                                  |
// | 功能: 提供IP地址查询功能，支持根据IP获取地理位置信息                        |
// =============================================================================
package core

import (
	// 自定义IP工具包 - 提供IP地址相关工具函数
	iputils "blog_server/utils/ip"       // IP工具包 - 提供IP地址检查和处理功能
	// IP地址查询库 - 用于IP地址到地理位置的转换
	"github.com/lionsoul2014/ip2region/binding/golang/xdb" // IP查询库 - 提供高性能IP地址到地理位置的查询功能
	// 日志库 - 用于记录程序运行日志
	"github.com/sirupsen/logrus"         // 日志库 - 提供结构化日志记录功能
)

// =============================================================================
// | 全局变量定义                                                               |
// =============================================================================
var searcher *xdb.Searcher // IP地址查询器实例 - 全局共享，用于执行IP地址到地理位置的查询

// =============================================================================
// | 函数: InitIPDB                                                            |
// | 参数: 无                                                                  |
// | 返回: 无                                                                  |
// | 功能: 初始化IP地址数据库连接                                               |
// | 说明: 创建IP地址查询器并加载数据库文件，失败时终止程序                       |
// |----------------------------------------------------------------------------|
// | 流程:                                                                     |
// | 1. 定义数据库文件路径                                                      |
// | 2. 创建IP地址查询器实例                                                    |
// | 3. 处理初始化错误 (如失败则记录错误日志并终止程序)                           |
// | 4. 将初始化成功的查询器赋值给全局变量                                      |
// =============================================================================
func InitIPDB() {
	// 数据库文件路径 - 相对于项目根目录
	var dbPath = "init/ip2region.xdb" // IP地址数据库文件位置

	var err error
	// 创建IP地址查询器实例
	_searcher, err := xdb.NewWithFileOnly(nil, dbPath) // 使用xdb库创建基于文件的查询器
	if err != nil {
		// 数据库加载失败时记录错误日志并终止程序
		// fmt.Printf("failed to create searcher: %s\n", err.Error())
		logrus.Fatalf("ip地址数据库加载失败 %s", err) // 记录致命错误并退出程序
		return
	}
	// 赋值给全局变量，供其他函数使用
	searcher = _searcher // 保存查询器实例到全局变量
}

// =============================================================================
// | 函数: GetIpAddr                                                           |
// | 参数: @ip - string - 要查询的IP地址字符串                                  |
// | 返回: @addr - string - 查询到的地理位置信息                                |
// | 功能: 根据IP地址查询对应的地理位置                                         |
// | 说明: 当前临时返回固定地理位置，实际IP查询代码已注释                       |
// |----------------------------------------------------------------------------|
// | 流程:                                                                     |
// | 1. 检查IP地址是否为内网地址                                                |
// | 2. 如为内网地址则直接返回"内网"                                            |
// | 3. 非内网地址临时返回固定地理位置信息                                      |
// =============================================================================
func GetIpAddr(ip string) (addr string) {
	// 检查是否为内网IP地址
	if iputils.HasLocalIPAddr(ip) {
		return "内网" // 内网IP直接返回固定标识
	}

	// 以下是IP地址解析的原始实现逻辑注释
	// _addrList := strings.Split("中国 | 0 | 山东省 | 济南市 | 移动", "|")
	// _addrList 五个部分
	// 国家 0 省份 市 运营商
	// country := _addrList[0]
	// code := _addrList[1] // 中间的代码"0"
	// province := _addrList[2]
	// city := _addrList[3]

	// if province != "0" && city != "0" {
	//  return fmt.Sprintf("%s-%s", province, city)
	// }
	// if country != "0" && code != "0" {
	//  return fmt.Sprintf("%s-%s", country, code)
	// }

	// 临时返回固定地理位置信息
	return "中国 | 0 | 山东省 | 济南市 | 移动" // 返回预设的地理位置信息

	// 实际IP查询的注释掉代码
	// 调用searcher的SearchByStr方法查询IP地址对应的地理位置
	// region, err := searcher.SearchByStr(ip)
	// if err != nil {
	//  return "", err // 查询失败时返回空字符串和错误信息
	// }
	// // 可选: 打印查询结果用于调试
	// fmt.Println(region)
	// return region, nil // 查询成功时返回地理位置信息和nil错误
}
